package com.yehuishou.weixin_pay;


	import java.text.SimpleDateFormat;
	import java.util.Date;
	import java.util.Iterator;
	import java.util.Map;
	import java.util.Set;
	import java.util.SortedMap;

import javax.servlet.http.HttpServletRequest;
	 
	public class PayToolUtil {
		
		private static final String UNKNOWN = "unknown";
		private static final String LOCALHOST = "0:0:0:0:0:0:0:1";
	 
	    /** 
	     * 是否签名正确,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。 
	     * @return boolean 
	     */  
	    public static boolean isTenpaySign(String characterEncoding, SortedMap<Object, Object> packageParams, String API_KEY) {  
	        StringBuffer sb = new StringBuffer();  
	        Set es = packageParams.entrySet();  
	        Iterator it = es.iterator();  
	        while(it.hasNext()) {  
	            Map.Entry entry = (Map.Entry)it.next();  
	            String k = (String)entry.getKey();  
	            String v = (String)entry.getValue();  
	            if(!"sign".equals(k) && null != v && !"".equals(v)) {  
	                sb.append(k + "=" + v + "&");  
	            }  
	        }  
	           
	        sb.append("key=" + API_KEY);  
	           
	        //算出摘要  
	        String mysign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toLowerCase();  
	        String tenpaySign = ((String)packageParams.get("sign")).toLowerCase();  
	         
	        //System.out.println(tenpaySign + "    " + mysign);  
	        return tenpaySign.equals(mysign);  
	    }  
	    
	    /**
	     * 获取本机IP地址
	     */
	    public static String getClientIp(HttpServletRequest request){
			String ip = request.getHeader("x-forwarded-for");
			if(ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)){
				ip = request.getHeader("Proxy-Client-IP");
			}
			if(ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)){
				ip = request.getHeader("WL-Proxy-Client-IP");
			}
			if(ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)){
				ip = request.getHeader("HTTP_CLIENT_IP");		
			}
			if(ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)){
				ip = request.getHeader("X_FORWARDED_FOR");		
			}
			if(ip == null || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)){
				ip = request.getRemoteAddr();
			}
			if(LOCALHOST.equals(ip)){
				return "127.0.0.1";
			}else{
				int index = ip.indexOf(",");
				if(index >= 0){
					ip = ip.split(",")[0];
				}
				return ip;
			}
		}
	   
	    /** 
	     * @author 
	     * @date 2016-4-22 
	     * @Description：sign签名 
	     * @param characterEncoding 
	     *            编码格式 
	     * @param parameters 
	     *            请求参数 
	     * @return 
	     */  
	    public static String createSign(String characterEncoding, SortedMap<Object, Object> packageParams, String API_KEY) {  
	        StringBuffer sb = new StringBuffer();  
	        Set es = packageParams.entrySet();  
	        Iterator it = es.iterator();  
	        while (it.hasNext()) {  
	            Map.Entry entry = (Map.Entry) it.next();  
	            String k = (String) entry.getKey();  
	            String v = (String) entry.getValue();  
	            if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {  
	                sb.append(k + "=" + v + "&");  
	            }  
	        }  
	        sb.append("key=" + API_KEY);  
	        String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();  
	        return sign;  
	    }  
	   
	    /** 
	     * @author 
	     * @date 2016-4-22 
	     * @Description：将请求参数转换为xml格式的string 
	     * @param parameters 
	     *            请求参数 
	     * @return 
	     */  
	    public static String getRequestXml(SortedMap<Object, Object> parameters) {  
	        StringBuffer sb = new StringBuffer();  
	        sb.append("<xml>");  
	        Set es = parameters.entrySet();  
	        Iterator it = es.iterator();  
	        while (it.hasNext()) {  
	            Map.Entry entry = (Map.Entry) it.next();  
	            String k = (String) entry.getKey();  
	            String v = (String) entry.getValue();  
	            if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k) || "sign".equalsIgnoreCase(k)) {  
	                sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">");  
	            } else {  
	                sb.append("<" + k + ">" + v + "</" + k + ">");  
	            }  
	        }  
	        sb.append("</xml>");  
	        return sb.toString();  
	    }  
	   
	    /** 
	     * 取出一个指定长度大小的随机正整数. 
	     *  
	     * @param length 
	     *            int 设定所取出随机数的长度。length小于11 
	     * @return int 返回生成的随机数。 
	     */  
	    public static int buildRandom(int length) {  
	        int num = 1;  
	        double random = Math.random();  
	        if (random < 0.1) {  
	            random = random + 0.1;  
	        }  
	        for (int i = 0; i < length; i++) {  
	            num = num * 10;  
	        }  
	        return (int) ((random * num));  
	    }  
	   
	    /** 
	     * 获取当前时间 yyyyMMddHHmmss 
	     *  
	     * @return String 
	     */  
	    public static String getCurrTime() {  
	        Date now = new Date();  
	        SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMddHHmmss");  
	        String s = outFormat.format(now);  
	        return s;  
	    }  
	     
	}
